package com.crm.common.utils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Collections;

import com.crm.model.BaseModel;
import com.crm.model.Privilege;

/**
 * 多叉树类
 */
public class TreeUtil {
	public static String toTree(List<Privilege> dataList) {
		// 节点列表（散列表，用于临时存储节点对象）
		HashMap nodeList = new HashMap();
		// 根节点
		Node root = null;
		// 根据结果集构造节点列表（存入散列表）
		for (Privilege privilege : dataList) {
			Node node = new Node();
			node.id = privilege.getId();
			node.name = privilege.getName();
			node.parentId = privilege.getParent()!=null ? privilege.getParent().getId():0;
			node.iconCls = privilege.getIcon()==null ?"":privilege.getIcon();
			node.indx = privilege.getIndex();
			node.config = privilege.getConfig()==null?"":privilege.getConfig();
			node.expanded = privilege.isExpanded();
			nodeList.put(node.id, node);
		}
		// 构造无序的多叉树
		Set entrySet = nodeList.entrySet();
		for (Iterator it = entrySet.iterator(); it.hasNext();) {
			Node node = (Node) ((Map.Entry) it.next()).getValue();
			if (node.parentId==0) {
				root = node;
			} else {
				((Node) nodeList.get(node.parentId)).addChild(node);
			}
		}
		// 输出无序的树形菜单的JSON字符串
		System.out.println(root.toString());
		// 对多叉树进行横向排序
		root.sortChildren();
		// 输出有序的树形菜单的JSON字符串
		System.out.println(root.toString());

		// 程序输出结果如下（无序的树形菜单）（格式化后的结果）：
		// {
		// id : '100000',
		// text : '廊坊银行总行',
		// children : [
		// {
		// id : '110000',
		// text : '廊坊分行',
		// children : [
		// {
		// id : '113000',
		// text : '廊坊银行开发区支行',
		// leaf : true
		// },
		// {
		// id : '111000',
		// text : '廊坊银行金光道支行',
		// leaf : true
		// },
		// {
		// id : '112000',
		// text : '廊坊银行解放道支行',
		// children : [
		// {
		// id : '112200',
		// text : '廊坊银行三大街支行',
		// leaf : true
		// },
		// {
		// id : '112100',
		// text : '廊坊银行广阳道支行',
		// leaf : true
		// }
		// ]
		// }
		// ]
		// }
		// ]
		// }

		// 程序输出结果如下（有序的树形菜单）（格式化后的结果）：
		// {
		// id : '100000',
		// text : '廊坊银行总行',
		// children : [
		// {
		// id : '110000',
		// text : '廊坊分行',
		// children : [
		// {
		// id : '111000',
		// text : '廊坊银行金光道支行',
		// leaf : true
		// },
		// {
		// id : '112000',
		// text : '廊坊银行解放道支行',
		// children : [
		// {
		// id : '112100',
		// text : '廊坊银行广阳道支行',
		// leaf : true
		// },
		// {
		// id : '112200',
		// text : '廊坊银行三大街支行',
		// leaf : true
		// }
		// ]
		// },
		// {
		// id : '113000',
		// text : '廊坊银行开发区支行',
		// leaf : true
		// }
		// ]
		// }
		// ]
		// }
		return root.toString();
	}

}

/**
 * 节点类
 */
class Node {
	/**
	 * 节点编号
	 */
	public int id;
	/**
	 * 节点内容
	 */
	public String name;
	/**
	 * 父节点编号
	 */
	public int parentId;
	/**
	 * 样式
	 */
	public String iconCls;
	/**
	 * 配置
	 */
	public String config;
	/**
	 * 排序
	 */
	public int indx;
	/**
	 * 是否展开 
	 */
	public boolean expanded;
	/**
	 * 孩子节点列表
	 */
	private Children children = new Children();

	// 先序遍历，拼接JSON字符串
	public String toString() {
		String result = "{" + "id : " + id 
			+ ", name : '" + name
			+ "', config : '" + config 
			+ "', iconCls : '" + iconCls 
			+ "', expanded : " + expanded 
			+ ", indx : " + indx ;

		if (children != null && children.getSize() != 0) {
			result += ", children : " + children.toString();
		} else {
			result += ", leaf : true";
		}

		return result + "}";
	}

	// 兄弟节点横向排序
	public void sortChildren() {
		if (children != null && children.getSize() != 0) {
			children.sortChildren();
		}
	}

	// 添加孩子节点
	public void addChild(Node node) {
		this.children.addChild(node);
	}
}

/**
 * 孩子列表类
 */
class Children {
	private List list = new ArrayList();

	public int getSize() {
		return list.size();
	}

	public void addChild(Node node) {
		list.add(node);
	}

	// 拼接孩子节点的JSON字符串
	public String toString() {
		String result = "[";
		for (Iterator it = list.iterator(); it.hasNext();) {
			result += ((Node) it.next()).toString();
			result += ",";
		}
		result = result.substring(0, result.length() - 1);
		result += "]";
		return result;
	}

	// 孩子节点排序
	public void sortChildren() {
		// 对本层节点进行排序
		// 可根据不同的排序属性，传入不同的比较器，这里传入ID比较器
		Collections.sort(list, new NodeIDComparator());
		// 对每个节点的下一层节点进行排序
		for (Iterator it = list.iterator(); it.hasNext();) {
			((Node) it.next()).sortChildren();
		}
	}
}

/**
 * 节点比较器
 */
class NodeIDComparator implements Comparator {
	// 按照节点编号比较
	public int compare(Object o1, Object o2) {
		int j1 = ((Node) o1).id;
		int j2 = ((Node) o2).id;
		return (j1 < j2 ? -1 : (j1 == j2 ? 0 : 1));
	}
}
